home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 1.iso
/
HENSA
/
MATHS
/
PLPLOT
/
PLPLOT.ZIP
/
examples
/
C
/
x17c.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-05
|
8KB
|
328 lines
/* $Id: x17c.c,v 1.2 1994/08/05 09:28:42 mjl Exp $
* $Log: x17c.c,v $
* Revision 1.2 1994/08/05 09:28:42 mjl
* Put in an early bail-out since it's not working yet.
*
* Revision 1.1 1994/04/08 12:08:54 mjl
* Preliminary stab at a strip chart demo (doesn't work yet).
*
*/
/* Demonstration program for PLPLOT: */
/* Plots a simple stripchart.
* Eventually I want a really cool demo here: slowly evolving plots of
* say density and temperature. These only need to get updated every so
* often. And then at the bottom some strip charts of energy or such
* that are continually updated.
*/
#include <plplot.h>
#include <math.h>
/* Data declarations for stripcharts. */
typedef struct {
PLINT npts, nptsmax;
PLFLT *x, *y;
PLFLT xmin, xmax, ymin, ymax, xjump, xlen;
char *xspec, *yspec, *labx, *laby, *labtop;
PLINT colbox, colline, collab;
} PLStrip;
static int sid; /* strip id number */
static PLStrip *strip[100]; /* Array of pointers */
static PLStrip *stripc; /* current strip chart */
/* Create 1d stripchart */
void
plstripc(PLINT *id, char *xspec, char *yspec,
PLFLT xmin, PLFLT xmax, PLFLT xjump, PLFLT ymin, PLFLT ymax,
PLINT colbox, PLINT colline, PLINT collab,
char *labx, char *laby, char *labtop);
/* Generates a complete stripchart plot. */
void
plstrip_gen(PLStrip *strip);
/* Add a point to a stripchart. */
void
plstripa(PLINT id, PLFLT x, PLFLT y);
/* Deletes and releases memory used by a stripchart. */
void
plstripd(PLINT id);
/* Miscellaneous */
#ifndef MAX
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#endif
/*----------------------------------------------------------------------*\
* main program
\*----------------------------------------------------------------------*/
int
main(int argc, char *argv[])
{
PLINT id, n, nsteps = 1000;
PLFLT y, ymin, ymax;
PLFLT t, tmin, tmax, tjump, dt;
PLINT colbox, collab, colline;
fprintf(stderr, "Sorry, this demo not yet in working order\n");
exit(1);
/* plplot initialization */
/* Parse and process command line arguments */
(void) plParseInternalOpts(&argc, argv, PL_PARSE_FULL);
plSetInternalOpt("db", "");
plSetInternalOpt("np", "");
/* Initialize plplot */
plinit();
/* Create strip chart */
/* User sets up plot completely except for window and data
* Eventually settings in place when strip chart is created will be
* remembered so that multiple strip charts can be used simultaneously.
*/
pladv(0);
/* For now just a standard viewport */
plvsta();
plcol(4);
/* Specify some reasonable defaults for ymin and ymax */
/* The plot will grow automatically if needed (but not shrink) */
ymin = -1.0;
ymax = 1.0;
/* Specify initial tmin and tmax -- this determines length of window.
/* Also specify maximum jump in t */
/* This can accomodate adaptive timesteps */
tmin = 0.;
tmax = 100.;
tjump = 25.;
/* Axes options same as plbox. */
/* Only automatic tick generation and label placement allowed */
/* Eventually I'll make this fancier */
colbox = 1;
colline = 4;
collab = 3;
plstripc(&id, "bcnst", "bcnstv",
tmin, tmax, tjump, ymin, ymax,
colbox, colline, collab,
"t", "d", "displacement vs time");
/* This is to represent a loop over time */
/* Let's try a random walk process */
y = 0.0;
dt = 0.1;
for (n = 0; n < nsteps; n++) {
t = n * dt;
y = y + rand();
plstripa(id, t, y);
}
/* Destroy strip chart and it's memory */
plstripd(id);
plend();
exit(0);
}
/*----------------------------------------------------------------------*\
* plstripc
*
* Create 1d stripchart.
\*----------------------------------------------------------------------*/
void
plstripc(PLINT *id, char *xspec, char *yspec,
PLFLT xmin, PLFLT xmax, PLFLT xjump, PLFLT ymin, PLFLT ymax,
PLINT colbox, PLINT colline, PLINT collab,
char *labx, char *laby, char *labtop)
{
int i;
/* Get a free strip id and allocate it */
for (i = 0; i < 100; i++) {
if (strip[i] == NULL)
break;
}
if (i == 0) {
fprintf(stderr, "plstripc: Cannot create new strip chart\n");
*id = -1;
return;
}
else {
sid = *id = i;
strip[sid] = (PLStrip *) malloc((size_t) sizeof(PLStrip));
if (strip[sid] == NULL)
plexit("plstripc: Out of memory.");
memset((char *) strip[sid], 0, sizeof(PLStrip));
}
/* Fill up the struct with all relevant info */
stripc = strip[sid];
stripc->npts = 0;
stripc->nptsmax = 100;
stripc->x = (PLFLT *) malloc((size_t) sizeof(PLFLT) * stripc->nptsmax);;
stripc->y = (PLFLT *) malloc((size_t) sizeof(PLFLT) * stripc->nptsmax);;
if (stripc->x == NULL || stripc->y == NULL)
plexit("plstripc: Out of memory.");
stripc->xmin = xmin;
stripc->xmax = xmax;
stripc->ymin = ymin;
stripc->ymax = ymax;
stripc->xjump = xjump;
stripc->xlen = xmax - xmin;
stripc->xspec = xspec;
stripc->yspec = yspec;
stripc->labx = labx;
stripc->laby = laby;
stripc->labtop = labtop;
stripc->colbox = colbox;
stripc->colline = colline;
stripc->collab = collab;
/* Generate the plot */
plstrip_gen(stripc);
}
/*----------------------------------------------------------------------*\
* plstrip_gen
*
* Generates a complete stripchart plot. Used either initially or
* during rescaling.
\*----------------------------------------------------------------------*/
void
plstrip_gen(PLStrip *strip)
{
/* Set up window */
plwind(strip->xmin, strip->xmax, strip->ymin, strip->ymax);
/* Draw box */
plcol(strip->colbox);
plbox(strip->xspec, 0.0, 0, strip->yspec, 0.0, 0);
plcol(strip->collab);
pllab(strip->labx, strip->laby, strip->labtop);
if (strip->npts > 0) {
plcol(strip->colline);
plline(strip->npts, strip->x, strip->y);
}
}
/*----------------------------------------------------------------------*\
* plstripa
*
* Add a point to a stripchart.
* Allocates memory and rescales as necessary.
\*----------------------------------------------------------------------*/
void
plstripa(PLINT id, PLFLT x, PLFLT y)
{
int i, istart;
stripc = strip[id];
/* Add new point, allocating memory if necessary */
if (++stripc->npts > stripc->nptsmax) {
stripc->nptsmax += 32;
stripc->x = (PLFLT *) realloc((void *) stripc->x, stripc->nptsmax);
stripc->y = (PLFLT *) realloc((void *) stripc->y, stripc->nptsmax);
}
stripc->x[stripc->npts-1] = x;
stripc->y[stripc->npts-1] = y;
stripc->xmax = x;
stripc->ymax = MAX(y, stripc->ymax);
stripc->ymin = MIN(y, stripc->ymin);
/* Now either plot new point or regenerate plot */
if (stripc->xmax - stripc->xmin < stripc->xlen) {
plP_movwor(stripc->x[stripc->npts-2], stripc->y[stripc->npts-2]);
plP_drawor(stripc->x[stripc->npts-1], stripc->y[stripc->npts-1]);
}
else {
/* Regenerating plot */
/* First push back the x scale */
stripc->xmin -= stripc->xjump;
stripc->xmax -= stripc->xjump;
istart = 0;
while (stripc->x[istart] - stripc->xjump < 0.)
istart++;
stripc->npts -= istart;
for (i = 0; i < stripc->npts; i++) {
stripc->x[i] = stripc->x[i+istart];
stripc->y[i] = stripc->y[i+istart];
}
stripc->xmin = stripc->x[0];
stripc->xmax = stripc->x[stripc->npts];
/* Now do the real work */
plstrip_gen(stripc);
}
}
/*----------------------------------------------------------------------*\
* plstripd
*
* Deletes and releases memory used by a stripchart.
\*----------------------------------------------------------------------*/
void
plstripd(PLINT id)
{
stripc = strip[id];
free((void *) stripc->x);
free((void *) stripc->y);
free((void *) stripc);
}